class Solution {
    /**
    思路：当前位置的最大值可以由前一个位置的最大值（一般为整数）和最小值（一般为负数） 决定

    如 -2 5 -4 

    第三个位置的最大值需要是 由 第二个位置的最小值来决定的
     */
    public int maxProduct(int[] nums) {
        if (nums.length == 1)
            return nums[0];
        int[] d1 = new int[nums.length];// 表示位置i的最大值
        int[] d2 = new int[nums.length];// 表示位置i的最小值
        d1[0] = d2[0] = nums[0];
        int ans = d1[0];
        for (int i = 1; i < nums.length; i++) {
            d1[i] = Math.max(nums[i], Math.max(d1[i - 1] * nums[i], d2[i - 1] * nums[i])); // maxVal
            d2[i] = Math.min(nums[i], Math.min(d1[i - 1] * nums[i], d2[i - 1] * nums[i])); // minVal
            ans = Math.max(ans, d1[i]);
        }
        return ans;
    }
}